package cn.seaboot.commons.lang;

/**
 * 主要用于 lambda 表达式下的数组遍历
 * <p>
 * 简单说，就是针对一个集合的数据，全部处理之后，一部分数据会转化成另一种，一部分会出现异常，
 * 当前工具类，用于存储处理结果。
 * <p>
 * 在消息订阅、日志等业务，会比较实用些。
 *
 * @param <L> 异常业务流输出
 * @param <R> 正常业务流输出
 * @author Mr.css
 * @version 2022-12-12 17:28
 * @since java 1.8
 */
public class SEither<L, R> {
    /**
     * 异常数据流
     */
    private final L left;
    /**
     * 正常数据流
     */
    private final R right;

    /**
     * -
     *
     * @param left  异常数据流
     * @param right 正常数据流
     */
    private SEither(L left, R right) {
        this.left = left;
        this.right = right;
    }

    /**
     * 获取异常数据流
     *
     * @return 异常流
     */
    public L getLeft() {
        return left;
    }

    /**
     * 获取正常数据流
     *
     * @return 异常流
     */
    public R getRight() {
        return right;
    }

    /**
     * 当前是否正常
     *
     * @return 是否正常
     */
    public boolean isRight() {
        return right != null;
    }

    /**
     * 当前是否正常
     *
     * @return 是否正常
     */
    public boolean isLeft() {
        return left != null;
    }


    @Override
    public String toString() {
        return "SimpleEither{" +
                "left=" + left +
                ", right=" + right +
                '}';
    }


    // static ------------------------------------------------------------------------------------------


    /**
     * -
     *
     * @param left 异常数据流
     */
    public static <L, R> SEither<L, R> left(L left) {
        return new SEither<>(left, null);
    }

    /**
     * -
     *
     * @param right 正常数据流
     */
    public static <L, R> SEither<L, R> right(R right) {
        return new SEither<>(null, right);
    }
}
